#include <vector>

using namespace std;

// 航班预订统计
// 这里有 n 个航班，它们分别从 1 到 n 进行编号。
// 有一份航班预订表 bookings ，
// 表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi]
// 意味着在从 firsti 到 lasti 
//（包含 firsti 和 lasti ）的 每个航班 上预订了 seatsi 个座位。
// 请你返回一个长度为 n 的数组 answer，里面的元素是每个航班预定的座位总数。
// 测试链接 : https://leetcode.cn/problems/corporate-flight-bookings/

class Solution 
{
public:
	// bookings
	// [1,5,6]
	// [2,9,3]
	// ...
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) 
    {
        vector<int> cnt(n + 2);
        // 设置差分数组，每一个操作对应两个设置
        for(auto& b : bookings)
        {
            cnt[b[0]] += b[2];
            cnt[b[1] + 1] -= b[2];
        }

        // 加工前缀和
        for(int i = 1; i < n + 2; ++i)
        {
            cnt[i] += cnt[i - 1];
        }

        return vector<int>(cnt.begin() + 1, cnt.begin() + n + 1);
    }
};


class Solution 
{
public:
    vector<int> corpFlightBookings(vector<vector<int>>& bookings, int n) 
    {
        vector<int> ret(n); // ret 既是差分数组，又是结果
        for(auto& b : bookings)
        {
            ret[b[0] - 1] += b[2]; // 将下标转成 0 ~ n - 1
            if(b[1] < n) ret[b[1]] -= b[2]; // 不越界才减
        }

        for(int i = 1; i < n; ++i)
        {
            ret[i] += ret[i - 1];
        }
        return ret;
    }
};